home *** CD-ROM | disk | FTP | other *** search
/ The Very Best of Atari Inside / The Very Best of Atari Inside 1.iso / mint / mntlib43 / mntlib / tcattr.c < prev    next >
C/C++ Source or Header  |  1994-01-15  |  5KB  |  198 lines

  1. /*
  2. Public domain termios tc[get|set]attr() for the MiNT library
  3. 10 October 1993 entropy@terminator.rs.itd.umich.edu -- first attempt
  4. */
  5.  
  6. #include <mintbind.h>
  7. #include <types.h>
  8. #include <errno.h>
  9. #include <file.h>
  10. #include <ioctl.h>
  11. #include <unistd.h>
  12. #include <types.h>
  13. #include <termios.h>
  14.  
  15. int
  16. tcgetattr(fd, stp)
  17.   int fd;
  18.   struct termios *stp;
  19. {
  20.   struct sgttyb sg;
  21.   struct tchars t;
  22.   struct ltchars lt;
  23.   short flags;
  24.   long r;
  25.  
  26.   r = Fcntl((short) fd, (long) &sg, TIOCGETP);
  27.   if (r < 0) {
  28.     errno = (int) -r;
  29.     return -1;
  30.   }
  31.   r = Fcntl((short) fd, (long) &t, TIOCGETC);
  32.   if (r < 0) {
  33.     errno = (int) -r;
  34.     return -1;
  35.   }
  36.   r = Fcntl((short) fd, (long) <, TIOCGLTC);
  37.   if (r < 0) {
  38.     errno = (int) -r;
  39.     return -1;
  40.   }
  41.   r = Fcntl((short) fd, (long) &flags, TIOCGFLAGS);
  42.   if (r < 0) {
  43.     flags = 0;
  44.   }
  45.   stp->c_iflag = (tcflag_t) (IGNBRK
  46.             | ((sg.sg_flags & CRMOD) ? ICRNL : 0)
  47.             | ((sg.sg_flags & (EVENP | ODDP)) ? INPCK : IGNPAR)
  48.             | ((sg.sg_flags & TANDEM) ? (IXON | IXOFF) : 0));
  49.   stp->c_oflag = (tcflag_t) OPOST;
  50.   stp->c_cflag = (tcflag_t) (CLOCAL | CREAD
  51.             | (((flags & _TF_STOPBITS) == _TF_2STOP) ? CSTOPB : 0)
  52.             | ((sg.sg_flags & EVENP) ? PARENB : 0)
  53.             | ((sg.sg_flags & ODDP) ? (PARENB | PARODD) : 0));
  54.   switch (flags & _TF_CHARBITS)
  55.   {
  56.     case _TF_5BIT:
  57.       stp->c_cflag |= CS5;
  58.       break;
  59.     case _TF_6BIT:
  60.       stp->c_cflag |= CS6;
  61.       break;
  62.     case _TF_7BIT:
  63.       stp->c_cflag |= CS7;
  64.       break;
  65.     case _TF_8BIT:
  66.     default:
  67.       stp->c_cflag |= CS8;
  68.       break;
  69.   }
  70.   stp->c_lflag = (tcflag_t) ((sg.sg_flags & (TOSTOP | NOFLSH))
  71.             | ((sg.sg_flags & ECHO) ? (ECHO | ECHOE | ECHOK) : 0)
  72.             | ((sg.sg_flags & XKEY) ? IEXTEN : 0)
  73.             | ((sg.sg_flags & RAW)
  74.                 ? 0 
  75.                 : ISIG | (sg.sg_flags & CBREAK ? 0 : ICANON)));
  76.   stp->_c_ispeed = (speed_t) sg.sg_ispeed;
  77.   stp->_c_ospeed = (speed_t) sg.sg_ospeed;
  78.   stp->c_cc[VEOF]    = (cc_t) t.t_eofc;
  79.   stp->c_cc[VEOL]    = (cc_t) t.t_brkc;
  80.   stp->c_cc[VERASE]    = (cc_t) sg.sg_erase;
  81.   stp->c_cc[VINTR]    = (cc_t) t.t_intrc;
  82.   stp->c_cc[VKILL]    = (cc_t) sg.sg_kill;
  83.   stp->c_cc[VQUIT]    = (cc_t) t.t_quitc;
  84.   stp->c_cc[VSUSP]    = (cc_t) lt.t_suspc;
  85.   stp->c_cc[VSTART]    = (cc_t) t.t_startc;
  86.   stp->c_cc[VSTOP]    = (cc_t) t.t_stopc;
  87.   stp->c_cc[VMIN]    = (cc_t) 1;
  88.   stp->c_cc[VTIME]    = (cc_t) 0;
  89.   stp->c_cc[VLNEXT]    = (cc_t) lt.t_lnextc;
  90.   stp->c_cc[VWERASE]    = (cc_t) lt.t_werasc;
  91.   return 0;
  92. }
  93.  
  94. int
  95. tcsetattr(fd, action, stp)
  96.   int fd;
  97.   int action;
  98.   const struct termios *stp;
  99. {
  100.   struct sgttyb sg;
  101.   struct tchars t;
  102.   struct ltchars lt;
  103.   short flags;
  104.   long r;
  105.  
  106.   r = Fcntl((short) fd, (long) &sg, TIOCGETP);
  107.   if (r < 0) {
  108.     errno = (int) -r;
  109.     return -1;
  110.   }
  111.   r = Fcntl((short) fd, (long) <, TIOCGLTC);
  112.   if (r < 0) {
  113.     errno = (int) -r;
  114.     return -1;
  115.   }
  116.   r = Fcntl((short) fd, (long) &flags, TIOCGFLAGS);
  117.   if (r < 0) {
  118.     flags = 0;
  119.   }
  120.   sg.sg_flags &= ~(CRMOD | TANDEM | EVENP | ODDP | TOSTOP 
  121.             | NOFLSH | RAW | CBREAK | ECHO | XKEY);
  122.   flags &= ~(_TF_STOPBITS | _TF_CHARBITS);
  123.   sg.sg_flags |= (((stp->c_iflag & ICRNL) ? CRMOD : 0)
  124.             | ((stp->c_iflag & (IXON | IXOFF)) ? TANDEM : 0));
  125.   flags |= ((stp->c_cflag & CSTOPB) ? _TF_2STOP : _TF_1STOP);
  126.   sg.sg_flags |= ((stp->c_cflag & PARENB)
  127.             ? ((stp->c_cflag & PARODD) ? ODDP : EVENP)
  128.             : 0);
  129.   switch (stp->c_cflag & (CS5 | CS6 | CS7 | CS8))
  130.   {
  131.     case CS5:
  132.       flags |= _TF_5BIT;
  133.       break;
  134.     case CS6:
  135.       flags |= _TF_6BIT;
  136.       break;
  137.     case CS7:
  138.       flags |= _TF_7BIT;
  139.       break;
  140.     case CS8:
  141.     default:
  142.       flags |= _TF_8BIT;
  143.       break;
  144.   }
  145.   sg.sg_flags |= ((stp->c_lflag & (TOSTOP | NOFLSH | ECHO))
  146.             | ((stp->c_lflag & IEXTEN) ? XKEY : 0)
  147.             | ((stp->c_lflag & ISIG)
  148.                ? (stp->c_lflag & ICANON ? 0 : CBREAK) : RAW));
  149.   sg.sg_ispeed = (char) stp->_c_ispeed;
  150.   sg.sg_ospeed = (char) stp->_c_ospeed;
  151.   t.t_eofc         = (char) stp->c_cc[VEOF];
  152.   t.t_brkc        = (char) stp->c_cc[VEOL];  
  153.   sg.sg_erase        = (char) stp->c_cc[VERASE];
  154.   t.t_intrc        = (char) stp->c_cc[VINTR];
  155.   sg.sg_kill        = (char) stp->c_cc[VKILL];
  156.   t.t_quitc        = (char) stp->c_cc[VQUIT];
  157.   lt.t_suspc        = (char) stp->c_cc[VSUSP];
  158.   t.t_startc        = (char) stp->c_cc[VSTART];
  159.   t.t_stopc        = (char) stp->c_cc[VSTOP];
  160.   lt.t_lnextc        = (char) stp->c_cc[VLNEXT];
  161.   lt.t_werasc        = (char) stp->c_cc[VWERASE];
  162.   switch (action)
  163.   {
  164.     case TCSAFLUSH:
  165.       tcflush(fd, TCIFLUSH);
  166.       /* fall through */
  167.     case TCSADRAIN:
  168.       r = Fcntl((short) fd, (long) &sg, TIOCSETP);
  169.       if (r < 0) {
  170.         errno = (int) -r;
  171.         return -1;
  172.       }
  173.       break;
  174.     case TCSANOW:
  175.       r = Fcntl((short) fd, (long) &sg, TIOCSETN);
  176.       if (r < 0) {
  177.         errno = (int) -r;
  178.         return -1;
  179.       }
  180.       break;
  181.     default:
  182.       errno = EINVAL;
  183.       return -1;
  184.   }
  185.   r = Fcntl((short) fd, (long) &t, TIOCSETC);
  186.   if (r < 0) {
  187.     errno = (int) -r;
  188.     return -1;
  189.   }
  190.   r = Fcntl((short) fd, (long) <, TIOCSLTC);
  191.   if (r < 0) {
  192.     errno = (int) -r;
  193.     return -1;
  194.   }
  195.   (void) Fcntl((short) fd, (long) &flags, TIOCSFLAGS);
  196.   return 0;
  197. }
  198.